最近为了解决系统性能问题,研究了一下memcache。由于其可以独立部署不占用JVM资源,其优越性可得而知,更由于memcached支持分布式部署这也使得可以实现超大内存服务器。具体memcache是哪个高手之作,再次不在赘述。
memcached的分布式有个奇怪的特点是其分布式的方式有客户端决定,所以客户端算法显得格外重要(hash算法 主流consist),笔者在此不在多说,有兴趣的可以下去研究。下面开始讲如何使用(后续会把源代码上传)。
1. 创建连接池设置相应参数
public class MemcacheClientBean { static MemCachedClient mClient; static { // 获取socket连接池的实例对象 SockIOPool ioPool = SockIOPool.getInstance(); // 服务器列表和其权重 String[] servers = { "192.168.6.40:11211", "192.168.6.40:11212" }; Integer[] weights = { 3 }; // 设置服务器信息 ioPool.setServers(servers); ioPool.setWeights(weights); // 设置初始连接数、最小和最大连接数以及最大处理时间 ioPool.setInitConn(5); ioPool.setMinConn(5); ioPool.setMaxConn(250); ioPool.setMaxIdle((1000 * 60 * 60L)); // 设置主线程的睡眠时间,单位为秒 ioPool.setMaintSleep(30); ioPool.setNagle(false); // 连接建立后的超时时间 ioPool.setSocketTO(3000); // 连接建立时的超时时间 ioPool.setSocketConnectTO(0); // 初始化连接池 ioPool.initialize(); } public static MemCachedClient getClient() { mClient = new MemCachedClient(); mClient.setPrimitiveAsString(true); return mClient; } }
不管是DB还是缓存,只要涉及到连接数及资源的限制设置都会涉及到连接池,所有请求由连接池统一管理。
2. 使用memcache常用方法 set get add replace等等
public class MClientTest { MemCachedClient mClient; boolean isOK = false; @Before public void init() { mClient = MemcacheClientBean.getClient(); } @Test public void testSetCache() { isOK = mClient.set("test", "不错"); System.out.println(isOK ? ">>>>>>>>>>>>>>set ok" : ">>>>>>>>>>>>>>set fail"); } @Test public void testGetCache() { System.out.println(mClient.get("test")); } @Test public void testAddCache() { // isOK = mClient.add("test", "你好"); isOK = mClient.add("test2", "你好"); System.out.println(isOK ? ">>>>>>>>>>>>>>add ok" : ">>>>>>>>>>>>>>add fail"); } @Test public void testReplaceCache() { isOK = mClient.replace("test2", "我很好"); System.out.println(isOK ? ">>>>>>>>>>>>>>replace ok" : ">>>>>>>>>>>>>>replace fail"); } @Test public void testFlushCache() { String[] caches = new String[10]; caches[0] = new String("test"); isOK = mClient.flushAll(); System.out.println(isOK ? ">>>>>>>>>>>>>>flush ok" : ">>>>>>>>>>>>>>flush fail"); } @Test public void testFlushAllCache() { isOK = mClient.flushAll(); System.out.println(isOK ? ">>>>>>>>>>>>>>flush all ok" : ">>>>>>>>>>>>>>flush all fail"); } }
基本使用就是这样,是不是很easy!后续会讲解memcache如何跟spring结合使用!
代码地址: https://files.cnblogs.com/dmc-tec/memcache-demo.rar